﻿using System.ComponentModel.DataAnnotations;
using Tanmia.Basis.Core;

namespace Tanmia.Warehouse.Core
{
    /// <summary>
    /// مميز المادة
    /// يمكن لإحدى المواد أن تكون من نفس النوع تماماً إنما تتميز كل واحدة عن غيرها من خلال مميز معين كاللون مثلاً
    /// </summary>
    public partial class Discriminator : BaseBusinessObject, IMovableElement, ICategorizable
    {
        public const string HeadName = "<مواصفة رئيسية>";
        public static readonly Discriminator HeadItem = new Discriminator { elementID = -1, name = HeadName };

        private Discriminator parent;
        private Discrimination discrimination;

        /// <summary>
        /// أب المميز الحالي, من أجل إنشاء بنية شجرية للمميزات
        /// </summary>
        [Display(Name = "الأب: ", ShortName = "الأب", Order = 6, AutoGenerateField = false)]
        public virtual Discriminator Parent
        {
            get { return parent; }
            set { SetValue<Discriminator>("Parent", ref parent, value); }
        }

        /// <summary>
        /// مميز المادة, يتسخدم من أجل الوصول إلى المادة
        /// </summary>
        public virtual Discrimination Discrimination
        {
            get { return discrimination; }
            set { SetValue<Discrimination>("Discrimination", ref discrimination, value); }
        }

        #region IMovableElement Members

        private int elementID;

        /// <summary>
        /// رقم تعريف مميز إحدى المواد
        /// </summary>
        [Display(Name = "رقم المميز: ", ShortName = "رقم المميز", Order = 0, AutoGenerateField = true)]
        public virtual int ElementID
        {
            get { return elementID; }
            set { SetValue<int>("ElementID", ref elementID, value); }
        }

        #endregion

        #region ICategorizable Members

        private string name;
        private string engName;
        private string code;
        private string number;

        /// <summary>
        /// اسم المميز
        /// </summary>
        [Display(Name = "اسم المميز: ", ShortName = "اسم المميز", Order = 3, AutoGenerateField = true)]
        [Required(AllowEmptyStrings = false, ErrorMessage = "يجب ادخال اسم المميز.")]
        public virtual string Name
        {
            get { return name; }
            set { SetValue<string>("Name", ref name, value); }
        }

        /// <summary>
        /// الاسم الأجنبي للمميز
        /// </summary>
        [Display(Name = "الأسم الأجنبي: ", ShortName = "الاسم الأجنبي", Order = 4, AutoGenerateField = true)]
        public virtual string EngName
        {
            get { return engName; }
            set { SetValue<string>("EngName", ref engName, value); }
        }

        /// <summary>
        /// رمز المميز
        /// </summary>
        [Display(Name = "رمز المميز: ", ShortName = "رمز المميز", Order = 5, AutoGenerateField = true)]
        public virtual string Code
        {
            get { return code; }
            set { SetValue<string>("Code", ref code, value); }
        }

        /// <summary>
        /// رقم المميز
        /// </summary>
        [Display(Name = "رقم المميز: ", ShortName = "رقم المميز", Order = 5, AutoGenerateField = true)]
        [Required(AllowEmptyStrings = false, ErrorMessage = "يجب ادخال رقم المميز.")]
        public virtual string Number
        {
            get { return number; }
            set { SetValue<string>("Number", ref number, value); }
        }

        #endregion

        public override bool IsEmpty
        {
            get { return ElementID == 0; }
        }

        public override bool Equals(object obj)
        {
            if (!base.Equals(obj)) return false;

            Discriminator discriminator = obj as Discriminator;

            if (!discriminator.ElementID.Equals(this.ElementID)) return false;

            return true;
        }
    }
}
